package com.qf.service.impl;

import com.qf.service.CacheService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author 何星宇
 * @version V1.0
 * @Date 2021/11/19 10:56
 */

@Service
@Slf4j
public class CacheServiceImpl implements CacheService {

    @Autowired
    private RedisTemplate redisTemplate;



    /**
     * 存储key-string，并设置生存时间
     * @param key
     * @param value
     * @param expireSecond
     * @return
     */
    @Override
    public boolean set(String key, Object value, Long expireSecond) {
        //(存数据)   两套操作redis的api
        //stringRedisTemplate.boundValueOps(key).set(value,expireSecond, TimeUnit.SECONDS);
        log.info("【缓存模块】  添加key-object数据 key={},value={},expireSecond={}",key,value,expireSecond);
        redisTemplate.opsForValue().set(key, value, expireSecond, TimeUnit.SECONDS);
        return true;
    }

    /**
     * 存储key-object，不设置生存时间
     * @param key
     * @param value
     * @return
     */
    @Override
    public boolean set(String key, Object value) {
        log.info("【缓存模块】  添加key-object数据 key={},value={}",key,value);
        redisTemplate.opsForValue().set(key, value);
        return true;
    }


    /**
     * 通过key获取string的value
     * @param key
     * @return
     */
    @Override
    public Object get(String key) {
        //取数据
        log.info("【缓存模块】  查询数据 key={}",key);
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 根据多个key删除数据
     * @param keys
     * @return
     */
    @Override
    public boolean del(String[] keys) {
        log.info("【缓存模块】  删除数据 keys={}",Arrays.toString(keys));
        redisTemplate.delete(Arrays.asList(keys));
        return true;
    }

    /**
     * 存储key-hash，不设置生存时间
     * @param key
     * @param map
     * @return
     */
    @Override
    public boolean hMSet(String key, Map map) {
        log.info("【缓存模块】  添加数据 key={},map={}",key,map);
        redisTemplate.opsForHash().putAll(key, map);
        return true;
    }

    /**
     * 通过key获取map的value
     * @param key
     * @return
     */
    @Override
    public Map hMGet(String key) {
        log.info("【缓存模块】  查询key-hash数据 key={}",key);
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 自增数据
     * @param key
     * @param delta 每次自增多少
     * @return
     */
    @Override
    public Long incr(String key, long delta) {
        log.info("【缓存模块】  自增数据 key={},delta={}",key,delta);
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 存储key-set，不设置生存时间
     * @param key
     * @param value
     * @return
     */
    @Override
    public boolean sadd(String key, String[] value) {
        log.info("【缓存模块】  添加key-set数据 key={},value={}",key,value);
        redisTemplate.opsForSet().add(key, value);
        return true;
    }

    @Override
    public Object hGet(String key , String filed) {
        log.info("【缓存模块】  hGet key={},filed={}",key,filed);
        return redisTemplate.opsForHash().get(key,filed);
    }

    @Override
    public boolean expire(String key, Long expireSecond) {
        log.info("【缓存模块】  expire key={},expireSecond={}",key,expireSecond);
        return redisTemplate.expire(key, expireSecond, TimeUnit.SECONDS);
    }
}
